//#include "iic.h"
#include "bus_dev.h"
#include "../gpio/gpio.h"

//static gpio_pin_e s_pin_sda = GPIO_DUMMY;
//static gpio_pin_e s_pin_scl = GPIO_DUMMY;
//static bool s_dir_scl;
#define IIC_SDA_PIN GPIO_DUMMY
#define IIC_SCL_PIN GPIO_DUMMY

#define TWI_SDA_LOW()    hal_gpio_fast_write(IIC_SDA_PIN,0)
#define TWI_SDA_HIGH()   hal_gpio_fast_write(IIC_SDA_PIN,1)

#define TWI_SCL_LOW()     hal_gpio_write(IIC_SCL_PIN,0)
#define TWI_SCL_HIGH()    hal_gpio_write(IIC_SCL_PIN,1)

#define TWI_SCL_READ()    ((hal_gpio_read(IIC_SCL_PIN)>>IIC_SCL_PIN)&0x01)
#define TWI_SDA_READ()    ((hal_gpio_read(IIC_SDA_PIN)>>IIC_SDA_PIN)&0x01)

#define TWI_SDA_OUTPUT()  hal_gpio_pin_init(IIC_SDA_PIN,OEN)
#define TWI_SDA_INPUT()   hal_gpio_pin_init(IIC_SDA_PIN,IE); hal_gpio_pull_set(IIC_SDA_PIN, STRONG_PULL_UP)

#define TWI_SCL_OUTPUT()  hal_gpio_pin_init(IIC_SCL_PIN,OEN)
#define TWI_SCL_INPUT()   hal_gpio_pin_init(IIC_SCL_PIN,IE); hal_gpio_pull_set(IIC_SCL_PIN, STRONG_PULL_UP)
/*
#define	SCL_H	GPIOC->BSRR = GPIO_Pin_12
#define	SCL_L	GPIOC->BRR = GPIO_Pin_12

#define	SDA_H	GPIOC->BSRR = GPIO_Pin_11
#define	SDA_L	GPIOC->BRR = GPIO_Pin_11

#define SCL_read      GPIOC->IDR  & GPIO_Pin_12
#define SDA_read      GPIOC->IDR  & GPIO_Pin_11
*/
#define	SCL_H	 TWI_SCL_HIGH() 
#define	SCL_L	 TWI_SCL_LOW() 

#define	SDA_H	TWI_SCL_HIGH()
#define	SDA_L	TWI_SCL_LOW()

//#define SCL_read      GPIOC->IDR  & GPIO_Pin_12
#define SDA_read      TWI_SDA_READ()
//GPIOC->IDR  & GPIO_Pin_11
static void scl_w(int value)
{

}

static int scl_r(void)
{

}

static void sda_w(int value)
{

}

static int sda_r(void)
{

}


void I2C_delay(void)
{	
   uint8_t i=5;
   while(i) 
   { 
     i--; 
   } 
}

void I2C_delay_100us(uint32_t nCount)
{	
	volatile int i = 450;
    while(nCount) 
    { 
		nCount--; 
		for(; i; i--);
	} 
}

bool i2c_start(void)
{
	SDA_H;
	SCL_H;
	I2C_delay();
	if(!SDA_read)
	{
		return false;	
	}
	SDA_L;
	I2C_delay();
	if(SDA_read)
	{
		return false;	
	}
	SDA_L;
	I2C_delay();
	return true;
}

void i2c_stop(void)
{
	SCL_L;
	I2C_delay();
	SDA_L;
	I2C_delay();
	SCL_H;
	I2C_delay();
	SDA_H;
	I2C_delay();
}

void i2c_ack(void)
{	
	SCL_L;
	I2C_delay();
	SDA_L;
	I2C_delay();
	SCL_H;
	I2C_delay();
	SCL_L;
	I2C_delay();
}

void i2c_nack(void)
{	
	SCL_L;
	I2C_delay();
	SDA_H;
	I2C_delay();
	SCL_H;
	I2C_delay();
	SCL_L;
	I2C_delay();
}

bool i2c_wait_ack(void)
{
	SCL_L;
	I2C_delay();
	SDA_H;			
	I2C_delay();
	SCL_H;
	I2C_delay();
	if(SDA_read)
	{
      SCL_L;
      return false;
	}
	SCL_L;
	return true;
}

void i2c_tx(uint8_t SendByte)
{
    uint8_t i=8;
    while(i--)
    {
      SCL_L;
      I2C_delay();
      if(SendByte&0x80)
        SDA_H;  
      else 
        SDA_L;
      
      SendByte<<=1;
      I2C_delay();
		  SCL_H;
      I2C_delay();
    }
    SCL_L;
}

uint8_t i2c_rx(void)
{ 
    uint8_t i=8;
    uint8_t ReceiveByte=0;

    SDA_H;				
    while(i--)
    {
      ReceiveByte<<=1;      
      SCL_L;
      I2C_delay();
	    SCL_H;
      I2C_delay();	
      if(SDA_read)
      {
        ReceiveByte|=0x01;
      }
    }
    SCL_L;

    return ReceiveByte;
}


int i2c_io_pin_init(gpio_pin_e pin_sda, gpio_pin_e pin_clk)
{
  
}
int i2c_io_pin_deinit(gpio_pin_e pin_sda, gpio_pin_e pin_clk)
{

}

bool i2c_io_read(uint8_t slave_addr, uint8_t reg, uint8_t* data, uint8_t size)
{
  if(!i2c_start())
	{
		return false;
	}
  i2c_tx(slave_addr);
  if(!i2c_wait_ack())
	{
		i2c_stop(); 
		return false;
	}
  i2c_tx(reg); 
  i2c_wait_ack();
  i2c_start();
  i2c_tx(slave_addr|0x01);
  i2c_wait_ack();
  while(size)
  {
    *data = i2c_rx();
    if(size == 1)
	  {
		  i2c_nack();
	  }
    else
	  {
		  i2c_ack(); 
	  }
    data++;
    size--;
  }
  i2c_stop();
  return true;

}

bool i2c_io_write(uint8_t slave_addr, uint8_t reg, uint8_t value)
{
  if(!i2c_start())return false;
  i2c_tx(slave_addr);
  if(!i2c_wait_ack())
  {
    i2c_stop();
    return false;
  }
  i2c_tx(reg);//i2c_tx((uint8_t)(reg & 0x00FF));
  i2c_wait_ack();	
  i2c_tx(value);
  i2c_wait_ack();   
  i2c_stop(); 
  return true;
}



